'''
@Project ：hdcms-scripts
@File    ：client.py
@IDE     ：PyCharm
@Author  ：朱广杰
@Date    ：2024/11/11 14:10
'''
import json

import requests
import jsonpath
from common.hd_log import mylog


class RequestsClient:
    session = requests.session() # 统一的一个session对象，可以帮我们自动关联cookie
    def __init__(self):
        self.logger = mylog
        self.session = RequestsClient.session
        self.url = None
        self.method = None
        self.headers = None
        self.params = None
        self.data = None
        self.json = None
        self.files = None
        self.resp = None
    def send(self,**kwargs):
        # 抽取时，每个接口的request请求不一定会发送多少个参数
        # 可以使用不定长关键字参数传递方式
        # 判断一下，调用send时，如果有些参数没有传，那么就用对象自身的
        if 'url' not in kwargs:
            kwargs['url'] = self.url
        if 'method' not in kwargs:
            kwargs['method'] = self.method
        if 'headers' not in kwargs:
            kwargs['headers'] = self.headers
        if 'params' not in kwargs:
            kwargs['params'] = self.params
        if 'data' not in kwargs:
            kwargs['data'] = self.data
        if 'json' not in kwargs:
            kwargs['json'] = self.json
        if 'files' not in kwargs:
            kwargs['files'] = self.files
        # # 遍历kwargs,收集接口请求的所有信息
        for key,value in kwargs.items():
            self.logger.debug(f'接口的{key}是:{value}')
        try:
            self.resp = self.session.request(**kwargs)
            # self.logger.debug(f'接口的响应状态码是:{self.resp.status_code}')
            self.logger.debug(f'接口的响应是:{self.resp.text}')
        except:
            self.logger.exception('接口发起异常')
        return self.resp
    def get_resp_info(self):
        return self.resp.text

    def extract_resp(self, jsonpath_express, index=0):
        """

        :param jsonpath_express: jsonpath表达式
        :param index: 大于0时返回匹配到的第几个，小于0时返回匹配到所有
        :return:
        """
        text = self.resp.text  # 获取响应结果的文本形式
        if text != '':
            resp_dict = json.loads(text)  # 将json格式的字符串转成字典形式
            if index >= 0:
                try:
                    res = jsonpath.jsonpath(resp_dict, jsonpath_express)[index]
                    self.logger.info(f'通过{jsonpath_express}在{text}提取成功:{res}')
                except Exception as e:
                    self.logger.exception(f'通过{jsonpath_express}在{text}提取失败')
                    raise e
            else:
                res = jsonpath.jsonpath(resp_dict, jsonpath_express)
                self.logger.info(f'通过{jsonpath_express}在{text}提取成功:{res}')
        else:
            self.logger.exception('响应为空无法提取数据')
            raise Exception('响应为空无法提取数据')
        return res
